package main

import (
	"fmt"
	"html/template"
	"net/http"
)

type Data struct {
	Name string
	Age int
}

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "hello %s!", r.URL.Path[1:])
}

/**
 * 设置cookie
 */
func testCookie(w http.ResponseWriter, r *http.Request) {
	//解析请求数据
	r.ParseForm()
	cookie := http.Cookie{
		Name:       "p_skey",
		Value:      r.Form.Get("name"), //从url中name的值
		HttpOnly:   true, //设置成true意味着只能通过http,https访问，不能使用js等非HTTP api进行访问
	}

	//设置cookie，第一个参数是rsp writer，第二个参数是cookie map的指针
	http.SetCookie(w, &cookie)
	//模拟登陆成功种下cookie，跳转到首页
	http.Redirect(w, r, "/", 301)
}

/**
 * 取cookie
 */
func getCookie(w http.ResponseWriter, r *http.Request) {
	cookie, err := r.Cookie ("p_skey")
	if err == nil {
		fmt.Fprintf(w, "cooke p_skey: %s, Domain: %s", cookie.Value, cookie.Domain)
	} else {
		fmt.Fprintf(w, "cooke error: %s", err)
	}
}

/**
 * 引用模板
 */
func login(w http.ResponseWriter, r *http.Request) {
	files := []string{"View/login.html"}
	//ParseFiles 对模板文件进行语法分析，并创建出相应的模板
	//Must 捕捉语法分析过程中可能产生的错误，用must函数去包围ParseFiles函数的执行结果
	templates := template.Must(template.ParseFiles(files...))
	mapper := make(map[string]string)
	mapper["Name"] = "LaLa"
	mapper["Address"] = "ShangHai"
	mapper["Age"] = "19"

	mapper2 := make(map[string]string)
	mapper2["Name"] = "LuLu"
	mapper2["Address"] = "BeiJing"
	mapper2["Age"] = "22"

	DataA := []map[string]string{mapper, mapper2}

	//使用ExecuteTemplate，要指定记载那个模板，第二个参数的值来源于模板里define的值
	//Execute 可以不用在模板里指定define，但是只能加载files里的第一个模板文件
	templates.ExecuteTemplate(w, "login", DataA)
}

func (data *Data) GetCount() (count int) {
	count = 100;
	return
}

func tmpData(w http.ResponseWriter, r *http.Request) {
	files := []string{"View/home.html"}
	t := template.Must(template.ParseFiles(files...))

	Dd := Data{"Aim", 23}

	//使用ExecuteTemplate，要指定记载那个模板，第二个参数的值来源于模板里define的值
	//Execute 可以不用在模板里指定define，但是只能加载files里的第一个模板文件
	//在模板里调用方法时当方法的接收者是值类型时，传入的data可以是值也可以是指针
	//当方法的接收者是指针类型时，传入的data只能是指针
	//类似于接口的调用
	t.ExecuteTemplate(w, "home", &Dd)
}